CI: publish Docker v2 manifests and cancel superseded builds - #201
Merged
Brandon-Haney merged 1 commit intoJul 30, 2026
Merged
Conversation
Two fixes to the image publishing workflow, both surfaced while bringing the rolling :dev channel online in StudioNirin#200. Docker v2 manifests. Images are pushed with OCI media types, and Unraid's update check requests only Docker media types, so the registry returns 404 for the manifest and the container reports "not available" rather than an update status. Verified against the registry with Docker-only Accept headers: studionirin/plexcache-d:dev -> 404 (application/vnd.oci.image.manifest.v1+json) studionirin/plexcache-d:latest -> 200 (application/vnd.docker.distribution.manifest.v2+json) `provenance: false` was already set and isn't sufficient on its own, so this also disables SBOM attestation and sets oci-mediatypes=false via the image exporter, which puts buildx back on a plain Docker v2 manifest. Pulling was never affected — Docker handles OCI fine — so this only changes what the update check can read. This matters most on a release: users whose update status reads "not available" are never told a new version exists. Cancel superseded builds. StudioNirin#199 and StudioNirin#200 merged 13 seconds apart. Both started a build, and the older commit's run finished two seconds later, so it won the :dev tag and left it pointing at a commit missing the newer merge. A concurrency group keyed on the ref cancels the stale run so :dev always tracks the newest push. Release builds use their own ref and are unaffected. No change to which events publish or to the tags produced.
StudioNirin
approved these changes
Jul 30, 2026
StudioNirin
left a comment
Owner
There was a problem hiding this comment.
This makes sense, im happy with this. I didnt even know half of these issues existed with docker builds haha. Not my area of expertise, though I should try and learn some of it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two follow-ups to #200, both found while bringing the rolling
:devchannel online. Worth having before a release goes out — see the note under the first one.1. Publish Docker v2 manifests
Images are pushed with OCI media types. Unraid's update check requests only Docker media types, so the registry returns 404 for the manifest and the container reports "not available" instead of an update status.
Verified against the registry with Docker-only Accept headers:
That's why
:latestshows an update status today and the new:devtag doesn't —:latestpredates whatever buildx change started emitting OCI.This is a known Unraid issue rather than anything specific to this project. There's a stable-release bug report titled "[7.0.0] Docker Version not available for containers with application/vnd.oci.image.manifest.v1+json manifest", plus several forum threads about ghcr.io images showing "not available".
provenance: falsewas already set and isn't enough on its own, so this also setssbom: falseandoci-mediatypes=falsethrough the image exporter, which puts buildx back on a plain Docker v2 manifest.Scope: pulling was never affected — Docker has handled OCI manifests for years, so
docker pulland force-update work either way. This only changes what the update check can read. The reason it's worth doing before a release: a user whose update status reads "not available" is never told a new version exists, so they stay on the old image indefinitely.2. Cancel superseded builds
#199 and #200 merged 13 seconds apart. Both started a build:
The older commit's build finished last, so it won the
:devtag and left it pointing at a commit that was missing the newer merge. I corrected that by re-running the newer build, but nothing prevented a repeat.A concurrency group keyed on the ref cancels the superseded run so
:devalways tracks the newest push. Release builds use their own ref and aren't affected.Not changed
Which events publish, and which tags they produce. The job condition and all the
type=tag rules are untouched —:latestand semver stay release-only,:devstays onmain/devpushes.Testing
sbom: falseandoutputs: type=image,oci-mediatypes=false,push=trueare running on my fork already. After the change,:devreturns 200 to Docker-only Accept headers where it previously 404'd:To confirm after merge:
:devas normal.docker manifest inspect ghcr.io/studionirin/plexcache-d:devsucceeds.:devshows a real update status rather than "not available".Note only newly built tags are corrected — existing tags keep whatever format they were pushed with.